package com.windgo.controller.wx;

import com.windgo.bean.common.BasePageInfo;
import com.windgo.bean.common.BaseRespVo;
import com.windgo.bean.common.BaseRespVo1;
import com.windgo.bean.common.CommonData;
import com.windgo.bean.vo.MarketCouponListVO;
import com.windgo.bean.vo.WxCouponMyListVO;
import com.windgo.bean.wxVo.SelectListResponseVO;
import com.windgo.service.CouponService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * @author mabai
 * @since 2022/10/14 15:42
 */
@RestController
@RequestMapping("wx/coupon")
public class WxCouponController {

    @Autowired
    CouponService couponService;

    /**
     * 给wx小程序分页填充优惠券列表
     *
     * @param info
     * @return com.windgo.bean.common.BaseRespVo
     * @author mabai
     * @since 2022/10/14 15:47
     */
    @GetMapping("list")
    public BaseRespVo list(BasePageInfo info) {
        CommonData<MarketCouponListVO> data = couponService.listCoupon(info);
        return BaseRespVo.ok(data);
    }

    /**
     * 给用户返回其含有的优惠券信息
     *
     * @param info,status
     * @return com.windgo.bean.common.BaseRespVo
     * @author mabai
     * @since 2022/10/14 17:19
     */
    // /wx/coupon/mylist
    @GetMapping("mylist")
    public BaseRespVo mylist(BasePageInfo info, Integer status) {
        CommonData<WxCouponMyListVO> data = couponService.listCouponUser(info, status);
        return BaseRespVo.ok(data);
    }

    /**
     * 用户领取优惠券的方法
     * 领取优惠券有两种情况：成功和失败两种情况
     * 其中失败又分为三种情况：一是优惠券已经达到领取上限，二是优惠券已经被领取完了，三是因为系统异常而事务回滚导致领取失败
     *
     * @return com.windgo.bean.common.BaseRespVo1
     * @author mabai
     * @since 2022/10/15 15:19
     */
    @PostMapping("receive")
    // /wx/coupon/receive
    public BaseRespVo1 receive(@RequestBody Map map) {
        Integer couponId = (Integer) map.get("couponId");
        int status = couponService.userReceiveCoupon(couponId);

        if (status == 0) {
            // 领取成功状态码为0
            return BaseRespVo1.ok();
        }

        if (status == 1) {
            // 领取数量已达上限状态码为1
            return BaseRespVo1.failed("优惠券领取数量已达上限");
        }
        if (status == 2) {
            // 优惠券领取完毕状态码为2
            return BaseRespVo1.failed("优惠券已领完");
        }

        return BaseRespVo1.failed("系统异常，请重试");

    }

    /**
     * 处理用户兑换优惠券的方法
     * 兑换优惠券有2种情况：1、优惠券兑换码和数据库的数据一致，兑换成功；2、优惠券兑换码和数据库的数据不一致，兑换失败
     *
     * @return com.windgo.bean.common.BaseRespVo1
     * @author mabai
     * @since 2022/10/16 11:10
     */
    @PostMapping("exchange")
    // /wx/coupon/exchange
    public BaseRespVo1 exchange(@RequestBody Map map) {
        String code = (String) map.get("code");
        int status = couponService.userExchangeCoupon(code);

        if (status == 0) {
            // 兑换成功状态码为0
            return BaseRespVo1.ok();
        }

        if (status == 1) {
            // 该优惠券已兑完 状态码为1
            return BaseRespVo1.failed("该优惠券已兑完 ", 742);
        }

        if (status == 2) {
            // 兑换数量已达上限 状态码为2
            return BaseRespVo1.failed("兑换数量已达上限", 742);
        }
        if (status == 3) {
            // 兑换数量已达上限 状态码为3
            return BaseRespVo1.failed("兑换码不正确", 742);
        }
        return BaseRespVo1.failed("兑换异常，请重试", 742);
    }

    /**
     * 处理用户下单时显示可用优惠券的方法
     *
     * @param cartId         购物车表id
     * @param grouponRulesId 团购规则表id
     * @return com.windgo.bean.common.BaseRespVo
     * @author mabai
     * @since 2022/10/16 17:27
     */
    @GetMapping("selectlist")
    public BaseRespVo selectList(Integer cartId, Integer grouponRulesId) {
        CommonData data = couponService.selectAvailableCouponList(cartId, grouponRulesId);
        return BaseRespVo.ok(data);
    }
}
